package com.xjh.t.controller;


import ch.qos.logback.core.joran.spi.ElementSelector;
import cn.hutool.core.util.IdUtil;
import cn.hutool.extra.ssh.JschRuntimeException;
import cn.hutool.json.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xjh.t.common.Constast;
import com.xjh.t.common.DataGridView;
import com.xjh.t.common.ResultObj;
import com.xjh.t.common.WebUtils;
import com.xjh.t.domain.AreaInfo;
import com.xjh.t.domain.Dept;
import com.xjh.t.domain.Role;
import com.xjh.t.domain.User;
import com.xjh.t.service.IAreaInfoService;
import com.xjh.t.service.IDeptService;
import com.xjh.t.service.IRoleService;
import com.xjh.t.service.IUserService;
import com.xjh.t.vo.UserVo;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author jobob
 * @since 2020-02-22
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @Autowired
    private IDeptService deptService;

    @Autowired
    private IRoleService roleService;

    @Autowired
    private IAreaInfoService areaInfoService;
    /**
     * 用户全查询
     */
    @RequestMapping("loadAllUser")
    public DataGridView loadAllUser(UserVo userVo) {
        IPage<User> page=new Page<>(userVo.getPage(), userVo.getLimit());
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq(StringUtils.isNotBlank(userVo.getName()), "loginname", userVo.getName()).or().eq(StringUtils.isNotBlank(userVo.getName()), "name", userVo.getName());
        queryWrapper.eq(StringUtils.isNotBlank(userVo.getAddress()), "address", userVo.getAddress());
        queryWrapper.eq("type", Constast.USER_TYPE_NORMAL);//查询系统用户
        queryWrapper.eq(userVo.getDeptid()!=null, "deptid",userVo.getDeptid());
        this.userService.page(page, queryWrapper);


        System.out.println(userService.getClass().getSimpleName());
        List<User> list = page.getRecords();
        List<UserVo> userVos = new ArrayList<>();

        for (User user : list) {
            Integer deptid = user.getDeptid();
            if(deptid!=null) {
                Dept one =deptService.getById(deptid);
                user.setDeptname(one.getTitle());
            }
            Integer mgr = user.getMgr();
            if(mgr!=null) {
                User one = this.userService.getById(mgr);
                user.setLeadername(one.getName());
            }

            UserVo userVo1 = new UserVo();
            BeanUtils.copyProperties(user,userVo1);

            userVos.add(userVo1);
        }

        return new DataGridView(page.getTotal(), userVos);

    }



    /**
     * 加载最大的排序码
     * @param
     * @return
     */
    @RequestMapping("loadUserMaxOrderNum")
    public Map<String,Object> loadUserMaxOrderNum(){
        Map<String, Object> map=new HashMap<String, Object>();

        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.orderByDesc("ordernum");
        IPage<User> page=new Page<>(1, 1);
        List<User> list = this.userService.page(page, queryWrapper).getRecords();
        if(list.size()>0) {
            map.put("value", list.get(0).getOrdernum()+1);
        }else {
            map.put("value", 1);
        }
        return map;
    }


    /**
     * 根据部门ID查询用户
     */
    @RequestMapping("loadUsersByDeptId")
    public DataGridView loadUsersByDeptId(Integer deptid) {
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq(deptid!=null, "deptid", deptid);
        queryWrapper.eq("available", Constast.TYPE_AVAILABLE_TRUE);
        queryWrapper.eq("type", Constast.USER_TYPE_NORMAL);
        List<User> list = this.userService.list(queryWrapper);
        return new DataGridView(list);
    }


    /**
     * 把用户名转成拼音
     */
    @RequestMapping("changeChineseToPinyin")
    public Map<String,Object> changeChineseToPinyin(String username){
        Map<String,Object> map=new HashMap<>();
        if(null!=username) {
            map.put("value", username);
        }else {
            map.put("value", "");
        }
        return map;
    }

    /**
     * 添加用户
     */
    @RequestMapping("addUser")
    public ResultObj addUser(UserVo userVo) {
        try {

            if(userVo.getVerifyCode() == null)
            {
                return ResultObj.NO_VERIFYCODE;
            }

            HttpSession session = WebUtils.getSession();
            if(session.getAttribute("verifyCode") == null)
                 return ResultObj.NO_SEND_VERIFYCODE;
            JSONObject jsonObject = new JSONObject(session.getAttribute("verifyCode"));

            Long psstime = System.currentTimeMillis() - jsonObject.getLong("createTime");

            if(psstime > 600000)
                return  ResultObj.VERIFYCOD_OUT_TIME;

            System.out.println(jsonObject.getStr("verifyCode") + "," + userVo.getVerifyCode() );
            System.out.println(jsonObject.getStr("mobile") + "," + userVo.getLoginname() );

            if(jsonObject.getStr("verifyCode").equals(userVo.getVerifyCode()) == false || jsonObject.getStr("mobile").equals(userVo.getLoginname()) == false)
                return ResultObj.VERIFYCOD_ERROR;

            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("loginname",userVo.getLoginname());
            List<User> userList = userService.list(queryWrapper);
            if(userList.size() > 0)
                return ResultObj.ADD_USER_FAIL;

            userVo.setType(Constast.USER_TYPE_NORMAL);//设置类型
            userVo.setHiredate(new Date());
            String salt= IdUtil.simpleUUID().toUpperCase();
            userVo.setSalt(salt);//设置盐
            userVo.setPwd(new Md5Hash(userVo.getPwd(), salt, 2).toString());//设置密码
            this.userService.save(userVo);
            return ResultObj.ADD_SUCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.ADD_ERROR;
        }
    }


    /**
     * 根据用户ID查询一个用户
     */
    @RequestMapping("loadUserById")
    public DataGridView loadUserById(Integer id) {
        return new DataGridView(this.userService.getById(id));
    }

    /**
     * 修改用户
     */
    @RequestMapping("updateUser")
    public ResultObj updateUser(UserVo userVo) {
        try {
            this.userService.updateById(userVo);
            return ResultObj.UPDATE_SUCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.UPDATE_ERROR;
        }
    }

    /**
     * 删除用户
     */
    @RequestMapping("deleteUser")
    public ResultObj deleteUser(Integer id) {
        try {
            this.userService.removeById(id);
            return ResultObj.DELETE_SUCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }
    /**
     * 重置用户密码
     */
    @RequestMapping("resetPwd")
    public ResultObj resetPwd(Integer id) {
        try {
            User user=new User();
            user.setId(id);
            String salt=IdUtil.simpleUUID().toUpperCase();
            user.setSalt(salt);//设置盐
            user.setPwd(new Md5Hash(Constast.USER_DEFAULT_PWD, salt, 2).toString());//设置密码
            this.userService.updateById(user);
            return ResultObj.RESET_SUCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.RESET_ERROR;
        }
    }


    /**
     * 根据用户ID查询角色并选中已拥有的角色
     */
    @RequestMapping("initRoleByUserId")
    public DataGridView initRoleByUserId(Integer id) {
        //1,查询所有可用的角色
        QueryWrapper<Role> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("available", Constast.TYPE_AVAILABLE_TRUE);
        List<Map<String, Object>> listMaps = this.roleService.listMaps(queryWrapper);

        //2,查询当前用户拥有的角色ID集合
        List<Integer> currentUserRoleIds=this.roleService.queryUserRoleIdsByUid(id);
        for (Map<String, Object> map : listMaps) {
            Boolean LAY_CHECKED=false;
            Integer roleId=(Integer) map.get("id");
            for (Integer rid : currentUserRoleIds) {
                if(rid==roleId) {
                    LAY_CHECKED=true;
                    break;
                }
            }
            map.put("LAY_CHECKED", LAY_CHECKED);
        }
        return new DataGridView(Long.valueOf(listMaps.size()), listMaps);
    }

    /**
     * 保存用户和角色的关系
     */
    @RequestMapping("saveUserRole")
    public ResultObj saveUserRole(Integer uid,Integer[] ids) {
        try {
            this.userService.saveUserRole(uid,ids);
            return ResultObj.DISPATCH_SUCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.DISPATCH_ERROR;
        }

    }

    /**
     * 修改密码
     */
    @RequestMapping("changeUserPwd")
    public ResultObj changeUserPwd(UserVo userVo) {

        User user = this.userService.getById(userVo.getId());
        if(user != null)
        {
            String inputpwd = new Md5Hash(userVo.getPwd(), user.getSalt(), 2).toString();
            if(!inputpwd.equals(user.getPwd()))
            {
                return ResultObj.CHANGEPWD_ERROR_WRONGPWD;
            }
            else
            {

                String salt=IdUtil.simpleUUID().toUpperCase();
                user.setSalt(salt);//设置盐
                user.setPwd(new Md5Hash(userVo.getNewPwd(), salt, 2).toString());//设置密码
                this.userService.updateById(user);
                return ResultObj.CHANGEPWD_SUCESS;
            }
        }
        else
        {
            return ResultObj.CHANGEPWD_ERROR_NOUSER;

        }

    }

    @RequestMapping("getVerifyCode")
    public ResultObj getVerifyCode(String phonenum) {

        String sendTemplate="SMS_204297075";//短信模板ID，需要去阿里云平台申请，审核通过后方能使用，通常是以"SMS_"开头字符串
        String code = (int)((Math.random() * 9 + 1) * 100000)+ "";//要发送给用户的短信验证码，行业通常使用六位纯数字

        String result= sendCode(phonenum,sendTemplate,code);
        if(result!=null&&"OK".equals(result.toUpperCase())){
            System.out.println("短信发送成功");
            JSONObject json = new JSONObject();


            //将验证码存到session中,同时存入创建时间
            //以json存放，这里使用的是阿里的fastjson
            HttpSession session = WebUtils.getSession();
           // json = new JSONObject();
            json.put("mobile", phonenum);
            json.put("verifyCode", code);
            json.put("createTime", System.currentTimeMillis());
            // 将认证码存入SESSION
            session.setAttribute("verifyCode", json);

            return ResultObj.SET_VERIFYCODE_SUCESS;
        }else{
            System.out.println("短信发送失败");
            return ResultObj.SET_VERIFYCODE_FAIL;
        }


    }

    public static String sendCode(String mobile,String sendTemplate,String code){
        //请求失败这里会抛ClientException异常
        String result="";
        try {
            //设置超时时间-可自行调整
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            //初始化ascClient需要的几个参数
            final String product = "Dysmsapi";//短信API产品名称（短信产品名固定，无需修改）
            final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名（接口地址固定，无需修改）
            //替换成你的AK
           // final String accessKeyId = "LTAIUMo4FyjJNBnT";//你的accessKeyId,参考本文档步骤2
          //  final String accessKeySecret = "ghxnlpzdVYVqnUWdNfJjXGVlU1QKEk";//你的accessKeySecret，参考本文档步骤2

            String accessKeyId = "LTAI4G95jys8AWMJgSVtSE3p";
            String accessKeySecret = "ZnaLaLRwBR68Kg6gw7xYpIySEBDTxZ";

            //初始化ascClient,暂时不支持多region（请勿修改）
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
                    accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            //组装请求对象
            SendSmsRequest request = new SendSmsRequest();
            //使用post提交
            request.setMethod(MethodType.POST);
            //必填:待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式；发送国际/港澳台消息时，接收号码格式为00+国际区号+号码，如“0085200000000”
            request.setPhoneNumbers(mobile);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName("爱眼医生");//注意要与你在短信控制台中的签名一致
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(sendTemplate);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
//		request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
            request.setTemplateParam("{\"code\":\""+code+"\"}");
            //可选-上行短信扩展码(扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//		request.setOutId("yourOutId");

            SendSmsResponse response = acsClient.getAcsResponse(request);
            result=response.getCode();
        } catch (Exception e) {
            result=e.getMessage();
        }
        return result;
    }

}


